home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1997 November & December
/
Amiga-CD 1997 #11-12.iso
/
amiga-internet-seiten
/
magazin
/
a05-97
/
pos_xmpl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-23
|
14KB
|
382 lines
/* Example.c: © Copyright Michael Christoph, proDAD, 09.02.1997 */
// Tags PLACETEXT_ABOVE und PLACETEXT_IN werden von pOS nicht beachtet
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/asl_protos.h>
#include <stdio.h>
#include <string.h>
#ifdef __pOS__
#include <p:pIntui/Tags.h>
#include <p:pIntui/EasyReq.h>
#include <p:pIntui/EasyTags.h>
#include <p:pGadget/GadItem.h>
#include <p:proto/pList.h>
#include <p:proto/pExec2.h>
#include <p:proto/pIntui2.h>
#endif
const UBYTE version[]="\0$VER: Example.c 1.00 ("__DATE2__") (© Feb.1997 by Michael Christoph)";
#ifdef __pOS__
struct pOS_IntuiDevice *gb_IntuiBase;
struct pOS_pSLBase *gb_PSLBase;
struct pOS_GfxBase *gb_GfxBase;
struct pOS_UtilityBase *gb_UtilityBase; /*** wird fast immer benötigt ***/ #else
struct IntuitionBase *IntuitionBase;
struct Library *GadToolsBase;
struct Library *AslBase;
#endif
UBYTE *LVTexte[]={ "Normal", "Rückfrage", "Warnung", "Fehler" };
#ifdef __pOS__
struct pOS_MemPool MemPool;
struct pOS_List Gad1List;
#else
extern struct MinList Gad1List;
struct Node Gad1Nodes[]={
&Gad1Nodes[1], (struct Node *)&Gad1List.mlh_Head, 0, 0, LVTexte[0],
&Gad1Nodes[2], &Gad1Nodes[0], 0, 0, LVTexte[1],
&Gad1Nodes[3], &Gad1Nodes[1], 0, 0, LVTexte[2],
(struct Node *)&Gad1List.mlh_Tail, &Gad1Nodes[2], 0, 0, LVTexte[3] };
struct MinList Gad1List={ (struct MinNode *)&Gad1Nodes[0],NULL,(struct MinNode *)&Gad1Nodes[2] }; #endif
/******************************************************************************/
void OpenEasyRequester(struct Window *win, ULONG reqtyp, STRPTR text, STRPTR file) {
#ifdef __pOS__
/*** bei Typ=0 die ausgewählte Grafik anzeigen, sonst den typenspezifisch voreingestellte Grafik ***/
ULONG reqtypen[]={ ESYTYP_Std, ESYTYP_Request,ESYTYP_Warn,ESYTYP_Error };
struct pOS_TagItem taglist[]={ TAG_IGNORE,(ULONG)file, TAG_DONE };
ULONG args[]={ (ULONG)text, (ULONG)file };
struct pOS_EasyStruct easy={ sizeof(struct pOS_EasyStruct),0,reqtypen[reqtyp],LVTexte[reqtyp],"Text: %.60s\nDatei: %.60s","_Ok",NULL,NULL,(pOS_TagItem *)&taglist };
if(reqtyp==0) taglist[0].ti_Tag=(ULONG)EASYTAG_GfxFile;
pOS_EasyRequestArgs((struct pOS_Window *)win,&easy,NULL,(ULONG*)&args); #else
struct EasyStruct easy={ sizeof(struct EasyStruct),0,LVTexte[reqtyp],"Text: %.60s\nDatei: %.60s","Ok" };
EasyRequest(win,&easy,NULL,text,file); #endif
}
/******************************************************************************/
void OpenFileRequester(struct Screen *scr, STRPTR buffer) {
struct FileRequester *fr;
if((fr=(struct FileRequester *) AllocAslRequestTags(ASL_FileRequest,
ASLFR_Screen, scr,
ASLFR_TitleText, "Grafik-Datei auswählen ...", #ifdef __pOS__
ASLFR_InitialDrawer, buffer, /*** wird automatisch in Schublade und Datei getrennt ***/ #else
ASLFR_InitialDrawer, "",
ASLFR_InitialFile, buffer, /*** Daten müssten in Verzeichnis- und Dateiteil zerlegt werden ***/ #endif
ASLFR_InitialPattern, "#?.pic",
ASLFR_RejectIcons, TRUE,
ASLFR_DoPatterns, TRUE,
TAG_DONE)))
{
if(AslRequest(fr,NULL))
{
strcpy(buffer,fr->fr_Drawer);
AddPart(buffer,fr->fr_File,299);
}
// else "zuwenig Speicher" oder "Abbruch" angeklickt
}
}
/******************************************************************************/
void RunningExample(struct Screen *scr, APTR visualInfo) {
struct Window *win;
struct Gadget *gads[4];
struct Gadget *gadlist=NULL;
struct Gadget *gadget=CreateContext(&gadlist);
struct NewGadget ng={ 0 };
#ifdef __pOS__
const UWORD titleheight=scr->WBorTop+scr->RastPort->Font->tf_YSize;
struct pOS_GadgetItem *gaditem;
ULONG i;
#else
struct TextAttr topaz8={ "topaz.font",8,FS_NORMAL,FPF_ROMFONT };
/*** Höhe des Fenstertitels, je nach Font, berechnen ***/
const UWORD titleheight=scr->WBorTop+scr->Font->ta_YSize+1; #endif
ng.ng_VisualInfo=visualInfo;
#ifndef __pOS__
/*** Font-Eintrag in den "Amiga"-Gadgets wird ignoriert ***/
ng.ng_TextAttr=scr->Font;
#endif
#ifdef __pOS__
/*** Listen-Einträge sind unter pOS IntuiObjecte. Sie sind etwas aufwendiger ***/
/*** zu erzeugen, jedoch wesentlich flexibler ***/
pOS_ListInit(&Gad1List);
pOS_InitMemPool(&MemPool,4096,MEMF_PUBLIC);
for(i=0; i<4; ++i)
{
if((gaditem=(struct pOS_GadgetItem *) pOS_AllocPoolMem(&MemPool,
sizeof(struct pOS_GadgetItem),MEMF_CLEAR)))
{
struct pOS_IntuiObj *obj;
gaditem->gdt_ID=i;
if((obj=(pOS_IntuiObj *) pOS_NewIObject(NULL,"itext.class",0,
ICLTAG_DrawInfo, visualInfo,
IOBJTAG_StaticString, LVTexte[i], /*** String wird nicht kopiert ***/
TAG_END)))
{
gaditem->gdt_Render=obj;
pOS_ListAddTail(&Gad1List,&gaditem->gdt_Node);
}
else printf("FEHLER: erzeugen von ListView-Eintrag schlug fehl.\n");
}
else printf("FEHLER: Speichermangel.\n");
}
gads[0]=pOS_NewIObject(NULL,"lvgad.class",0, /*** Name: scr->scr_DrawInfo->dri_Names[SCRNAM_GLVClass] ***/
ICLTAG_Left, 17,
ICLTAG_Top, 18+titleheight,
ICLTAG_Width, 204,
ICLTAG_Height, 64,
ICLTAG_DrawInfo, visualInfo,
ICLTAG_ID, 1,
ICLTAG_RelVerify, TRUE,
LVGADTAG_List, &Gad1List,
//LVGADTAG_VAutoGad, TRUE, /*** rechts Schieber anzeigen ***/
LVGADTAG_CursorScroll, TRUE,
LVGADTAG_CursorSelect, TRUE, /*** Eintrag kann über Pfeiltasten gewählt werden ***/
LVGADTAG_Key1, TRUE,
LVGADTAG_AlwaysOne, TRUE,
ICLTAG_AutoDelete, TRUE); /*** löscht sich selbständig am Ende ***/ #else
/*** für ListView-Gadget gibt es keine "Amiga"-Umsetzung ***/
ng.ng_LeftEdge =17;
ng.ng_TopEdge =18+titleheight;
ng.ng_Width =204;
ng.ng_Height =70;
ng.ng_GadgetText="Requester-Typen";
ng.ng_GadgetID =1;
ng.ng_Flags =PLACETEXT_ABOVE;
gads[0]=gadget=CreateGadget(LISTVIEW_KIND,gadget,&ng, GT_Underscore,'_', GTLV_Labels,&Gad1List, GTLV_ShowSelected,NULL, TAG_END); #endif
ng.ng_LeftEdge =240;
ng.ng_TopEdge =18+titleheight;
ng.ng_Width =143;
ng.ng_Height =16;
ng.ng_GadgetText="Requester-_Text"; /*** wird unter pOS momentan nicht übernommen ***/
ng.ng_GadgetID =2;
ng.ng_Flags =PLACETEXT_ABOVE;
gads[1]=gadget=CreateGadget(STRING_KIND,gadget,&ng, GT_Underscore,'_', GTST_String,"Hello World", TAG_END);
ng.ng_LeftEdge =240;
ng.ng_TopEdge =38+titleheight;
ng.ng_Width =143;
ng.ng_Height =18;
ng.ng_GadgetText="_Easy-Requester";
ng.ng_GadgetID =3;
ng.ng_Flags =PLACETEXT_IN;
gads[2]=gadget=CreateGadget(BUTTON_KIND,gadget,&ng, GT_Underscore,'_',TAG_END);
ng.ng_LeftEdge =240;
ng.ng_TopEdge =64+titleheight;
ng.ng_Width =143;
ng.ng_Height =18;
ng.ng_GadgetText="_File-Requester";
ng.ng_GadgetID =4;
ng.ng_Flags =PLACETEXT_IN;
gads[3]=gadget=CreateGadget(BUTTON_KIND,gadget,&ng, GT_Underscore,'_',TAG_END);
if(gadlist && gads[0] && gads[1] && gads[2] && gads[3])
{
/*** unter pOS muß das Fenster vom Typ SIMPLE_REFRESH sein !!! ***/
if((win=OpenWindowTags(NULL,
WA_Left,10, WA_Top,14, WA_Width,400, WA_Height,92+titleheight, #ifdef __pOS__
WA_IDCMP, IDCMP_CloseWindow | IDCMP_RefreshWindow | IDCMP_StdSysMsg, #else
WA_IDCMP, IDCMP_GADGETUP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW, #endif
WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE, #ifdef __pOS__
WA_Title, "pOS - Example",
WA_ScreenTitle, "Programming Example · pOS-Version by Michael Christoph, proDAD (Feb.1997)",
SCRTAG_AutoSizeGadget,gads[0], /*** pOS-ListView kann automatisch eingehängt werden ***/ #else
WA_Title, "Amiga - Example",
WA_ScreenTitle, "Programming Example · Amiga-Version by Michael Christoph, proDAD (Feb.1997)",
WA_Gadgets, gadlist,
#endif
WA_CustomScreen,scr,
TAG_DONE)))
{
BOOL running=TRUE;
UWORD selectid=0;
static UBYTE fileBuffer[300]="ENV:SysGfx/ReqIcn.pic";
#ifdef __pOS__
/*** "Amiga"-Gadgets dürfen erst nach dem Fenster öffnen eingehängt werden !!! ***/
AddGList(win,gadlist,~0,~0,NULL); #endif
GT_RefreshWindow(win,NULL);
RefreshGList(gadlist,win,NULL,5); /*** Context-Gadget unter pOS mitzählen !!! ***/
/*** ersten Eintrag selektieren (Amiga: Eintragnummer; pOS: Adresse von Eintrag) ***/ #ifdef __pOS__
pOS_SetGadgetAttrs((struct pOS_Window *)win,(struct pOS_Gadget *)gads[0],LVGADTAG_SelectItem,Gad1List.lh_Head,TAG_DONE); #else
GT_SetGadgetAttrs(gads[0],win,NULL,GTLV_Selected,0,TAG_DONE); #endif
/*** Schleife bis Fenster geschlossen wird ***/
while(running)
{
struct IntuiMessage *msg;
Wait(1L << win->UserPort->mp_SigBit);
while((msg=GT_GetIMsg(win->UserPort)))
{
switch(msg->Class)
{
case IDCMP_REFRESHWINDOW:
GT_BeginRefresh(win);
/*** hier eigene Fensterinhalte neuzeichnen ***/
GT_EndRefresh(win,TRUE);
break;
case IDCMP_CLOSEWINDOW:
running=FALSE;
break;
case IDCMP_VANILLAKEY:
switch(msg->Code)
{
case 't': case 'T':
ActivateGadget(gads[1],win,NULL);
break;
#ifndef __pOS__
/*** unter pOS werden die Shortcuts als GADGETUP gesendet ! ***/
case 'e': case 'E':
OpenEasyRequester(win,selectid,(((struct StringInfo *)gads[1]->SpecialInfo)->Buffer),fileBuffer);
break;
case 'f': case 'F':
OpenFileRequester(scr,fileBuffer);
break;
#endif
}
break;
case IDCMP_GADGETUP:
switch(((struct Gadget *)msg->IAddress)->GadgetID)
{
case 1: /* Listview: Requester-Typen */ #ifdef __pOS__
pOS_GetGadgetAttr((struct pOS_Window *)win,(struct pOS_Gadget *)gads[0],LVGADTAG_SelectItem,(ULONG*)&gaditem);
selectid=gaditem ? gaditem->gdt_ID : 0; #else
selectid=msg->Code; #endif
break;
case 2: /* String: Requester-Text */
break;
case 3: /* Button: Easy-Requester */
OpenEasyRequester(win,selectid,(((struct StringInfo *)gads[1]->SpecialInfo)->Buffer),fileBuffer);
break;
case 4: /* Button: File-Requester */
OpenFileRequester(scr,fileBuffer);
break;
}
break;
}
/*** Nachricht erst dann zurückschicken, wenn auf keine Zeiger daraus mehr zurückgegriffen wird ***/
GT_ReplyIMsg(msg);
}
}
#ifdef __pOS__
/*** "Amiga"-Gadgets selber entfernen ***/
RemoveGList(win,gadlist,~0);
#endif
CloseWindow(win);
}
else printf("FEHLER: öffnen des Fensters fehlgeschlagen.\n");
FreeGadgets(gadlist); /*** pOS-Gadget entfernt und löscht sich selbständig ***/
}
else printf("FEHLER: Gadgets konnten nicht erstellt werden.\n");
#ifdef __pOS__
/*** Listen-Einträge entfernen und MemoryPool freigeben ***/
while((gaditem=(struct pOS_GadgetItem *) pOS_ListRemHead(&Gad1List)))
if(gaditem->gdt_Render) pOS_DisposeIObject(gaditem->gdt_Render);
pOS_FreePoolAll(&MemPool);
#endif
}
/******************************************************************************/
void main(void)
{
LONG args[1]={ 0 };
struct RDArgs *rda;
if((rda=ReadArgs("PUBSCREEN/K",args,NULL)))
{
#ifdef __pOS__
if((gb_IntuiBase=(struct pOS_IntuiDevice *) pOS_OpenLibrary("pIntui.library",0)))
{
if((gb_PSLBase=(struct pOS_pSLBase *) pOS_OpenLibrary("pSl.library",0)))
{
if((gb_GfxBase=(struct pOS_GfxBase *) pOS_OpenLibrary("pGraphics.library",0)))
{
if((gb_UtilityBase=(struct pOS_UtilityBase *) pOS_OpenLibrary("pUtility.library",0)))
{
#else
if((IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",37)))
{
if((GadToolsBase=OpenLibrary("gadtools.library",37)))
{
if((AslBase=OpenLibrary("asl.library",37)))
{
#endif
struct Screen *scr;
APTR visualInfo;
if((scr=LockPubScreen(args[0] ? (STRPTR)args[0] : NULL)))
{
if((visualInfo=GetVisualInfo(scr,TAG_DONE)))
{
RunningExample(scr,visualInfo);
FreeVisualInfo(visualInfo);
}
else printf("FEHLER: VisualInfo von Screen nicht ermittelbar.\n");
UnlockPubScreen(NULL,scr);
}
else printf("FEHLER: Pubscreen nicht ermittelbar.\n");
#ifdef __pOS__
pOS_CloseLibrary((struct pOS_Library *)gb_UtilityBase);
}
else printf("FEHLER: öffnen pUtility.library fehlgeschlagen.\n");
pOS_CloseLibrary((struct pOS_Library *)gb_GfxBase);
}
else printf("FEHLER: öffnen pGraphics.library V37 fehlgeschlagen.\n");
pOS_CloseLibrary((struct pOS_Library *)gb_PSLBase);
}
else printf("FEHLER: öffnen pSl.library V37 fehlgeschlagen.\n");
pOS_CloseLibrary((struct pOS_Library *)gb_IntuiBase);
}
else printf("FEHLER: öffnen pIntui.library V37 fehlgeschlagen.\n"); #else
CloseLibrary(AslBase);
}
else printf("FEHLER: öffnen asl.library V37 fehlgeschlagen.\n");
CloseLibrary(GadToolsBase);
}
else printf("FEHLER: öffnen gadtools.library V37 fehlgeschlagen.\n");
CloseLibrary((struct Library *)IntuitionBase);
}
else printf("FEHLER: öffnen intuition.library V37 fehlgeschlagen.\n"); #endif
FreeArgs(rda);
}
else printf("FEHLER: in den übergebenen Argumenten.\n"); }
/******************************************************************************/